<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //  &&(逻辑与)	||(逻辑或)	!(逻辑非)

        // &&  全真则真，一假全假。
        // 运算符两边操作数都是布尔值（运算后 true false），返回布尔值
        // 运算符两边，通过大小比较得到的true或false，自己直接写的true或false 返回值是布尔值。
        // 运算费用两边的操作数，不全是布尔值的话，返回值不一定是布尔值（可能是原值）
        var a = 10;
        var b = 5;
        var c = a > b && a < b;
        console.log(c);// false
        // 短路逻辑：
        //如果第一个操作符是假的话，由第一个操作数决定。
        //如果第一个操作数是真的话，由第二个操作数决定。
        console.log(1 && 3);// 3
        console.log(null && 'hello');//null
        console.log([] && 'world');//'world'
        console.log({} && false);//false
        console.log({} && 5 > 4);//true
        console.log(NaN && 8);//NaN
        //  || 一真则真，全假则假
        // 短路逻辑：
        //如果第一个操作符是 真 的话，由第一个操作数决定。
        //如果第一个操作数是 假 的话，由第二个操作数决定。
        console.log(8 > 6 || true);// true
        console.log(8 < 6 || true);// true
        console.log(NaN || 8);// 8
        console.log(10 || undefined);// undefined
        console.log('hello' || 5 + 4 + true + 'world');//'hello'

        var num = 0;
        console.log(123 || num++); // 到123 输出，中断后面。
        console.log(num);// 0

        //  !  逻辑非  取反
        console.log(!5 || 'hello');//'hello'
        console.log(!5 && 'hello');//false
        console.log(!(5 && 'hello'));//false
    </script>
</body>

</html>